/*
 * JsonParser.hpp
 *
 *  Created on: Mar 20, 2009
 *      Author: hua
 */

#ifndef JSONPARSER_HPP_
#define JSONPARSER_HPP_
#include <vector>
#include "Json.hpp"

namespace json {
	using namespace std;

	#define JSON_TOKEN_MAX_DEPTH 32

	enum JsonTokenError {
		JsonTokenSuccess,
		JsonTokenContinue,
		JsonTokenErrorDepth,
		JsonTokenErrorParseEof,
		JsonTokenErrorParseUnexpected,
		JsonTokenErrorParseNull,
		JsonTokenErrorParseBoolean,
		JsonTokenErrorParseNumber,
		JsonTokenErrorParseArray,
		JsonTokenErrorParseObjectKeyName,
		JsonTokenErrorParseObjectKeySep,
		JsonTokenErrorParseObjectValueSep,
		JsonTokenErrorParseString,
		JSON_TOKEN_ERROR_PARSE_COMMENT
	};

	enum JsonTokenState {
		/* ignore space,tab,comment .... */
		JsonTokenStateIgnoreWords,
		JsonTokenStateStart,
		JsonTokenStateFinish,
		JsonTokenStateNull,
		JsonTokenStateCommentStart,
		JsonTokenStateComment,
		/* end of line */
		JsonTokenStateCommentEndOfLine,
		JsonTokenStateCommentEnd,
		JsonTokenStateString,
		JsonTokenStateStringEscape,
		JsonTokenStateEscapeUnicode,
		JsonTokenStateBoolean,
		JsonTokenStateNumber,
		JsonTokenStateArray,
		JsonTokenStateArrayAdd,
		JsonTokenStateArraySep,
		JsonTokenStateObjectFieldStart,
		JsonTokenStateObjectField,
		JsonTokenStateObjectFieldEnd,
		JsonTokenStateObjectValue,
		JsonTokenStateObjectValueAdd,
		JsonTokenStateObjectSep
	};


	class JsonTokenStackRecord {
	public:
		enum JsonTokenState state;
		enum JsonTokenState savedState;
		JsonObject* obj;
		JsonObject* current;
		String fieldName;
	};

	class StringBuffer : public String{
	public:
		StringBuffer();
		void append(Char c);
	};

	class JsonToken{
	public:
		JsonToken();
	public:
		StringBuffer buffer;
		int depth;
		int isDouble;
		unsigned int ucs_char;
		Char quoter;
		JsonTokenStackRecord stack[JSON_TOKEN_MAX_DEPTH];		
	public:
		void resetLevel(int depth);
	};

	class JsonParseException : public JsonException{
	public:
		JsonParseException(JsonTokenError code);
		JsonParseException(const String& message);
		JsonTokenError errorCode;
		const Char *errorDescription();
	private:
		static const Char *s_errorDescriptions[];
	};

	/**
	 * Json对象的解析工具类
	 */
	class JsonParser{
	public:
		JsonParser();
		~JsonParser();
	public:
		/** 将给定的Json字符串格式化为Json对象 */
		JsonObject* parse(const String& str);
		/** 格式化字符串的部分内容为Json对象 */
		JsonObject* parse(String::const_iterator start,String::const_iterator end);
	private:
		vector<JsonObject*> objects;
	};

}	// end json
#endif /* JSONPARSER2_HPP_ */
